package com.yc.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.yc.entity.Attendance;
import com.yc.vo.AttendanceHistory;
import com.yc.vo.ScheduleDetail;
import com.yc.vo.StudentAttendanceRecord;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.yc.entity.AttendanceRecords;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * 考勤详情表;(attendance_records)表数据库访问层
 *
 * @date : 2023-6-28
 */
@Mapper
public interface AttendanceRecordsMapper extends BaseMapper<AttendanceRecords> {

    @Select("SELECT b.stuid FROM student_info b WHERE b.cid=#{cid}")
    List<Map<String,Object>> selectstuidbycid(@Param("cid") String cid);

    /**
     * 查询班级id
     */
    @Select("SELECT a.id FROM class_info a")
    List<String> selectallclass();

    /**
     * 查询学号和班级
     * @return
     */
    @Select("SELECT b.stuid,a.cname FROM class_info a,student_info b WHERE a.id=b.cid")
    List<Map<String,Object>> stuidandclass();

    /**
     *  通过状态查询该状态下的次数
     * @param stuid 学生id
     * @param status 考勤状态 1已到 2请假 3迟到 4早退 5旷课
     * @return 该状态的次数
     */
    @Select("SELECT COUNT(*) FROM attendance_records WHERE stuid=#{stuid} AND `status`=#{status}")
    int StatusCount(@Param("stuid") String stuid,@Param("status") int status);


    /**
     * 分页查询指定行数据
     *
     * @param page 分页参数
     * @param wrapper 动态查询条件
     * @return 分页对象列表
     */
    IPage<AttendanceRecords> selectByPage(IPage<AttendanceRecords> page, @Param(Constants.WRAPPER) Wrapper<AttendanceRecords> wrapper);


    /**
     * @Description 批量插入
     * @Return
     * @Author dm
     * @Date Created in 2023/7/19 15:27
     **/
    boolean insertBatch(@Param("list") List<AttendanceRecords> attendanceRecords,@Param("id")String id);

    /**
     * @Description 查询历史考勤信息
     * @Return
     * @Author dm
     * @Date Created in 2023/7/21 16:06
     **/
    List<AttendanceHistory> queryPage(@Param("attendanceHistory") AttendanceHistory attendanceHistory,
                                      @Param("begin") Long begin,
                                      @Param("size") Long size);

    /**
     * @Description 查询历史数量
     * @Return
     * @Author dm
     * @Date Created in 2023/7/21 16:37
     **/
    int countHistory(@Param("attendanceHistory") AttendanceHistory attendanceHistory);

    /**
    *@Description 根据id更改考勤状态
    *@Return
    *@Author dm
    *@Date Created in 2023/7/22 16:34
    **/
    int updateById(@Param("id") String id,@Param("status") String status);

    /**
     * 统计当前学年的旷课、请假、早退情况
     * @return
     */
    Map<String, Object> selectAllAttendanceByStudent(@Param("stuid") String stuid, @Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 获取当天的考勤记录
     * @param stuid 学生学号
     * @param date 当天日期
     * @return 当天的考勤情况
     */
    List<StudentAttendanceRecord> selectAttendanceByStuidAndDate(@Param("stuid") String stuid,@Param("date") String date);

    /**
     * 获取当月的考勤记录
     * @param stuid 学生学号
     * @param date 当月日期
     * @return 学生当月的考勤记录
     */
    List<StudentAttendanceRecord> selectMonthAttendanceByStuidAndDate(@Param("stuid") String stuid, @Param("date") String date);

    /**
     * 通过学号获取该学生当月的上课状态
     * @param stuid 学生学号
     * @param date  当月日期
     * @return  学生当月的上课状态
     */
    List<StudentAttendanceRecord> selectMonthStatusByStuidAndDate(@Param("stuid") String stuid, @Param("date") String date);

    /**
    *@Description 查询某一条考勤记录中的各个考勤情况的信息
    *@Return
    *@Author dm
    **/
    int queryStatusNums(@Param("attendanceHistory") AttendanceHistory attendanceHistory,@Param("status") int status);

    /**
     * 批量添加学生手动考勤记录
     * @param attendanceRecordsList 学生考勤记录集合
     * @param username 老师工号
     * @return 1 成功 0失败
     */
    int addAttendanceRecords(@Param("attendanceRecordsList") List<AttendanceRecords> attendanceRecordsList, @Param("username") String username);

    /**
     * 批量修改学生手动考勤记录
     * @param attendanceRecordsList 学生考勤记录集合
     * @param username 老师工号
     * @return 成功 0失败
     */
    int modifyAttendanceRecords(@Param("attendanceRecordsList") List<AttendanceRecords> attendanceRecordsList, @Param("username") String username);

    /**
     * 统计每个月的考勤记录
     * @param stuid 学生学号
     * @param status 考勤状态
     * @return
     */
    List<Map<String, Object>> selectPerMonthAttendance(@Param("stuid") String stuid, @Param("status") String status,
                                                       @Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 查询每学年的起始时间 和 结束时间
     * @param date 学年起始时间
     * @return 起始时间 和 结束时间
     */
    List<String> selectNowSchoolYear(Integer date);

    /**
     * 查询是否已经考勤过了
     * @param attid 考勤表id
     * @return
     */
    Integer selectAttid(Integer attid);
}
